﻿#include <iostream>
#include <string>
using namespace std;
/* 对象行为型模式
1.意图
使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链，并沿着这条链传递该请求，
直到有一个对象处理它为止。
2.适用性
在以下条件下使用Responsibility链：
a.有多个的对象可以处理一个请求，哪个对象处理该请求运行时刻自动确定
b.你想在不明确指定接收者的情况下，向多个对象中的一个提交一个请求
c.可处理一个请求的对象集合应被动态指定
*/
//抽象一个处理类
class Handler
{
public:
	Handler():pnext(nullptr){}
	void SetNextHandler(Handler* pnext)
	{
		this->pnext = pnext;
	}
	virtual void HandlerRequest(int days) = 0;
protected:
	Handler* pnext;
};
class Director :public Handler
{
public:
	void HandlerRequest(int days)
	{
		if (days <= 1)
		{
			cout << "主管回复：批准" << endl;
		}
		else
		{
			cout << "大于1天，找经理审批" << endl;
			pnext->HandlerRequest(days);
		}
	}
};

class Manager :public Handler
{
public:
	void HandlerRequest(int days)
	{
		if (days <= 3)
		{
			cout << "经理回复：批准" << endl;
		}
		else
		{
			cout << "大于3天，找老板审批" << endl;
			pnext->HandlerRequest(days);
		}
	}
};
class Boss :public Handler
{
public:
	void HandlerRequest(int days)
	{
		if (days <= 30)
		{
			cout << "老板回复：批准" << endl;
		}
		else
		{
			cout << "大于30天，不予批准" << endl;			
		}
	}
};
/*
int main()
{
	Handler* director = new Director();
	Handler* manager = new Manager;
	Handler* boss = new Boss;
	director->SetNextHandler(manager);
	manager->SetNextHandler(boss);
	cout << "请假1天结果：" << endl;
	director->HandlerRequest(1);
	cout << "请假3天结果：" << endl;
	director->HandlerRequest(3);
	cout << "请假15天结果：" << endl;
	director->HandlerRequest(15);
	cout << "请假45天结果：" << endl;
	director->HandlerRequest(45);
	return 0;
}
*/